use std::{fmt::format,
   future::{self, Future},
   pin::Pin,
   task::{Context,Poll},
   };

use xgmacros::{my_vec, my_try,my_ready,test_fibonacci};
use anyhow::{anyhow,Result};

fn main(){
   // 

   // loop {
   //    //test_fibonacci();

   //    
   // }

  // test_myvec();
  test_mytry();

  
}


fn test_mytry() -> Result<()>{
   println!("in test_mytry");
  // let ret = mytry_f3(mytry_f2(mytry_f1("hello")?)?) ;
   // match ret {
   //    Ok(s) => println!("ret  ==>{} ", s),
   //    Err(e) => println!("error => {}", e),
   // }


    // println!("{}" , ret);  // 这个 老师那是可以的， 只是没有内容输出， 但我这就是要分情况 输出， 写出要报错
    let ret2 = my_try!(mytry_f3(my_try!(mytry_f2(my_try!(mytry_f1("hello")))))) ;
    println!("RET2 => {}" , ret2);  

   Ok(())
}


fn mytry_f1(s: impl AsRef<str>) -> Result<String>{
   println!("mytry_f1, {}",s.as_ref());
   Ok(format!("f1 :{}",s.as_ref()))

}

fn mytry_f2(s:impl AsRef<str>) -> Result<String>{
   Ok(format!("f2 :{}",s.as_ref()))

}

fn mytry_f3(s:impl AsRef<str>) -> Result<String>{
   Err(anyhow!("f3: {}",s.as_ref()))

}



fn test_myvec() -> Result<()>{
   let  v:Vec<i32> = my_vec![];
   // let v = my_vec![2;4];
   //let   v = vec![1,2,3];
 //   let v:Vec<i32> = my_vec!["1".parse()?,
 //   "5".parse(),
 //   "7".parse(),
 //   "12".parse(),];
 
 
    let v:Vec<i32> = vec!["1".parse()?,
   "5".parse()?,
   "7".parse()?,
   "12".parse()?,];
    println!("{:?}",v);
 
 
    let v1 =    <[_]>::into_vec(Box::new([5,6,7,8]));
 
 
       print!("{:?}",v1);
 
    let v2 = Box::new([4,5,6,7]).to_vec();
    println!("{:?}",v2);
 
    // 这种 parse 的还没能支持， 抄过来也没用。
    // let v3 = my_vec!["1".parse()?,
    // "5".parse()?,
    // "7".parse()?,
    // "12".parse()?,];
 
    let v3 = my_vec![8,4,5,3];
    println!("v3 => {:?}",v3);
    Ok(())

}



fn test_my_ready(){
  let mut cx = Context::from_waker(features::task::noop_waker_ref());


}

fn poll_fut(cx: &mut Context<'_>) -> Poll<usize> {
   let mut fut = future::ready(42);
   let fut =Pin::new(&mut fut);
   my_ready!(fut.poll(cx));
}